import axios from "axios";
import router from "@/router";
import { Message } from 'element-ui';

/**
 * 通用的节点数据获取方法
 * @param {string} url - 请求URL
 * @param {object} data - 请求数据
 * @param {string} dataKey - 数据存储的键名
 * @param {function} startCallback - 请求开始回调
 * @param {function} endCallback - 请求结束回调
 * @param {string} method - 请求方法
 * @returns {Promise} - 返回处理后的响应
 */
export const fetchNodeData = async (
    url,
    data = null,
    dataKey = null,
    startCallback = null,
    endCallback = null,
    method = 'get'
) => {
    try {
        // 调用开始回调
        if (typeof startCallback === 'function') {
            startCallback();
        }

        // 发送请求
        const res = await request({
            url,
            method,
            [method.toLowerCase() === 'get' ? 'params' : 'data']: data
        });

        // 处理响应数据
        if (data && dataKey) {
            data[dataKey] = res.data || [];
        }

        return res;
    } catch (error) {
        console.error(`请求${url}失败:`, error);
        return { success: false, message: '请求失败' };
    } finally {
        // 调用结束回调
        if (typeof endCallback === 'function') {
            endCallback();
        }
    }
};

//request = 创建axios对象
const request = axios.create({
    baseURL: process.env.VUE_APP_BASEURL, //全局后端API地址
    timeout: 1000 * 60
})

//request拦截器，发送前做例如token或param的处理
request.interceptors.request.use(config => {
    config.headers['Content-Type'] = 'application/json;charset=utf-8';
    let userJson = JSON.parse(localStorage.getItem("userInfo") || '{}');
    config.headers['token'] = userJson.token; //放入请求头
    return config;
}, error => {
    console.error('request error:' + error);
    return Promise.reject(error); //promise
});

//response响应拦截器，在响应后统一处理
request.interceptors.response.use(
    response => {
        let res = response.data;

        //兼容后端返回的字符串数据
        if (typeof res === 'string') {
            res = res ? JSON.parse(res) : res;
        }
        //无权限自动跳回登录页
        if (res.code === '401') {
            router.push('/login')
        }
        // 根据后端返回格式调整
        if (res.code !== '200' && res.success !== true) {
            Message.error(res.msg || res.message || '操作失败');
            return Promise.reject(new Error(res.msg || res.message || '操作失败'));
        }
        return res;
    }, error => {
        console.error('response error:' + error)
        Message.error('网络错误，请稍后重试');
        return Promise.reject(error);
    }
)

//es6语法：把封装的request对象，导出去
export default request